import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { NzMessageService } from 'ng-zorro-antd/message';
import { SqeAddService } from './sqe-add.service';

import { ConfigDictListService } from '../../config/config-dict-list/config-dict-list.service';
import { DatePipe } from '@angular/common';
@Component({
    selector: 'app-sqe-add',
    templateUrl: './sqe-add.component.html',
    styleUrls: ['./sqe-add.component.scss'],
    providers: [DatePipe]
})
export class SqeAddComponent implements OnInit {
    id: any;
    /**
     * 供应商详情数据(公共)
     */
    detailsData: any = {};
    /**
     * 模态框表单
     */
    validateForm!: FormGroup;
    // 数据绑定方式提交
    modalForm: any = {}
    /**
     * 保存 加载中状态
    */
    isLoading = false;
    /**
     * 合同文件
     */
    fileList: any[] = [];
    /**
     * 附件
     */
    fileList2: any[] = [];
    /**
     * 合同生效日期
     */
    createTime: any = null;
    /**
     * 合同失效日期
     */
    time: any = null;
    /**
     * 供应商类型
     */
    supplier_type: any = [];
    /**
     * 供应商结算方式
     */
    supplier_settlement_type: any = [];

    state: any = "0";
    /**
     * 草稿
     */
    draft: any = false;
    /**
     * 正常
     */
    normal: any = true;
    /**
     * 冻结
     */
    frozen: any = true;
    /**
     * 合作结束
     */
    endOfCooperation: any = true;
    /**
     * 合同过期
     */
    contractExpired: any = true;
    // 地区列表
    areaList: any = []
    // 营业执照
    licenseFileList: any[] = [];
    // 法人身份证
    idcardFileList: any[] = [];
    // 账户附件
    accountFileList: any[] = [];
    // 成立日期
    establishDates: any = null;
    constructor(
        private ConfigDictListService: ConfigDictListService,
        private router: Router,
        private fb: FormBuilder,
        private sqeAddService: SqeAddService,
        private activatedRoute: ActivatedRoute,
        private message: NzMessageService,
        private datePipe: DatePipe
    ) { }

    ngOnInit() {
        // 获取字典的 供应商类型
        this.ConfigDictListService.getDictList({
            // 名称或者编码搜索
            parentKey: "supplier_type",
            // 多少页，默认1
            pageNum: 1,
            // 每页多少条，默认10
            pageSize: 999
        }).subscribe((res: any) => {
            for (const key in res.data.list.records) {
                const element = res.data.list.records[key];
                this.supplier_type.push({
                    label: element.name,
                    value: element.content
                });
            }
            console.log(res);
        }, err => {
        });

        // 获取字典的 供应商结算方式
        this.ConfigDictListService.getDictList({
            // 名称或者编码搜索
            parentKey: "supplier_settlement_type",
            // 多少页，默认1
            pageNum: 1,
            // 每页多少条，默认10
            pageSize: 999
        }).subscribe((res: any) => {
            for (const key in res.data.list.records) {
                const element = res.data.list.records[key];
                this.supplier_settlement_type.push({
                    label: element.name,
                    value: element.content
                });
            }
            console.log(res);
        }, err => {
        });

        this.validateForm = this.fb.group({
            id: [null], // id
            abbreviation: [null], // 简称
            name: [null], // 企业名称
            type: [null], // 类型
            state: [null], // 状态(0草稿、1正常、2冻结、3合作结束、4合同过期)
            remark: [null], // 入库单备注

            businessFile: [''], // 营业执照
            tax: [''], // 社会信用代码
            juridicalPerson: [''], // 法定代表人
            juridicalIdcard: [''], // 法人身份证
            establishTime: [null], // 成立日期
            registeredCapital: [''], // 注册资本
            registeredAddress: [''], // 注册地址

            contacts: [null], // 联系人
            phoneNumber: [null], // 联系方式
            email: [''], // 邮箱
            districtId: [null], // 省 市 区
            detailedAddress: [''], // 详细地址
            remindMsg: [''], // 消息提醒

            contractFile: [null], // 合同文件
            signatory: [''], // 我司签约人
            createTime: [null], // 合同生效日期
            endTime: [null], // 合同失效日期
            contractEnclosure: [null], // 合同附件

            settlementType: [null], // 结算方式
            companyName: [null], // 公司名称
            bankAccount: [null], // 银行账号
            bank: [null], // 开户行
            bankAddress: [''], // 开户行地址
            accountAttachment: [''], // 账户附件

            usedServiceFee: [''], // 二手商城服务费
            partsServiceFee: [''], // 配件商城服务费
            separateType: '', // 分账接收方类型：0-商户、1-个人
            separateAccount: '' // 分账接收方账号
        })

        this.activatedRoute.params.subscribe(params => {
            this.id = params.id;
            if (this.id != 0) {
                this.getDetails();
                return
            }
            // 获取 省 市 区
            this.httpAreaList()
        })

    }

    /**
     * 初始化数据
     */
    initData(obj: any) {
        if (this.detailsData) {
            const { address } = obj
            this.validateForm.get('id')!.setValue(obj.id);
            this.validateForm.get('abbreviation')!.setValue(obj.abbreviation); // 简称
            this.validateForm.get('name')!.setValue(obj.name); // 企业名称
            this.validateForm.get('type')!.setValue(obj.type + ""); // 类型
            this.validateForm.get('state')!.setValue(obj.state + ""); // 状态
            this.validateForm.get('remark')!.setValue(obj.remark); // 备注

            this.validateForm.get('businessFile')!.setValue(obj.businessFile); // 营业执照
            this.validateForm.get('tax')!.setValue(obj.tax); // 社会统一信用代码
            this.validateForm.get('juridicalPerson')!.setValue(obj.juridicalPerson); // 法定代表人
            this.validateForm.get('juridicalIdcard')!.setValue(obj.juridicalIdcard); // 法人身份证
            this.validateForm.get('establishTime')!.setValue(obj.establishTime); // 成立日期
            this.validateForm.get('registeredCapital')!.setValue(obj.registeredCapital); // 注册资本
            this.validateForm.get('registeredAddress')!.setValue(obj.registeredAddress); // 注册地址

            this.validateForm.get('contacts')!.setValue(obj.contacts); // 联系人
            this.validateForm.get('phoneNumber')!.setValue(obj.phoneNumber); // 联系方式
            this.validateForm.get('email')!.setValue(obj.email); // 邮箱
            this.validateForm.get('detailedAddress')!.setValue(obj.detailedAddress); // 详细地址
            this.validateForm.get('remindMsg')!.setValue(obj.remindMsg); // 消息提醒

            this.validateForm.get('contractFile')!.setValue(obj.contractFile); // 合同文件
            this.validateForm.get('signatory')!.setValue(obj.signatory); // 我司签约人
            this.validateForm.get('createTime')!.setValue(obj.createTime); // 合同生效日期
            this.validateForm.get('endTime')!.setValue(obj.endTime); // 合同失效日期
            this.validateForm.get('contractEnclosure')!.setValue(obj.contractEnclosure); // 合同附件

            this.validateForm.get('settlementType')!.setValue(obj.settlementType ? String(obj.settlementType) : ''); // 结算方式
            this.validateForm.get('companyName')!.setValue(obj.companyName); // 公司名称
            this.validateForm.get('bankAccount')!.setValue(obj.bankAccount); // 银行账号
            this.validateForm.get('bank')!.setValue(obj.bank); // 开户行
            this.validateForm.get('bankAddress')!.setValue(obj.bankAddress); // 开户行地址
            this.validateForm.get('accountAttachment')!.setValue(obj.accountAttachment); // 账户附件

            this.validateForm.get('usedServiceFee')!.setValue(obj.usedServiceFee || ''); // 二手商城服务费
            this.validateForm.get('partsServiceFee')!.setValue(obj.partsServiceFee || ''); // 配件商城服务费
            this.validateForm.get('separateType')!.setValue((obj.separateType || obj.separateType === 0) ? obj.separateType : ''); // 分账接收方类型：0-商户、1-个人
            this.validateForm.get('separateAccount')!.setValue(obj.separateAccount || ''); // 分账接收方账号

            this.establishDates = obj.establishTime; // 成立日期
            this.createTime = obj.createTime; // 合同生效日期
            this.time = obj.endTime; // 合同失效日期
            
            // this.validateForm.get('contacts')!.setValue(obj.contacts);
            // this.validateForm.get('phoneNumber')!.setValue(obj.phoneNumber);
            
            // this.validateForm.get('contractFile')!.setValue(obj.contractFile);
            // this.validateForm.get('createTime')!.setValue(obj.createTime);
            // this.validateForm.get('endTime')!.setValue(obj.endTime);
            // this.validateForm.get('contractEnclosure')!.setValue(obj.contractEnclosure);
            // this.validateForm.get('settlementType')!.setValue(obj.settlementType + "");
            // this.validateForm.get('companyName')!.setValue(obj.companyName);
            // this.validateForm.get('tax')!.setValue(obj.tax);
            // this.validateForm.get('address')!.setValue(obj.address);
            // this.validateForm.get('telephone')!.setValue(obj.telephone);
            // this.validateForm.get('bank')!.setValue(obj.bank);
            // this.validateForm.get('bankAccount')!.setValue(obj.bankAccount);
            // this.modalForm.address = address
            // this.fileList2 = obj.contractEnclosure.split(',');
            // 获取 省 市 区
            this.httpAreaList()
            // 营业执照
            if (obj.businessFile) {
                this.licenseFileList = obj.businessFile.split(',').map((item: any) => {
                    return {
                        url: item,
                        id: item,
                        name: (item.match(/[^\\/]+\.[^\\/]+$/) || []).pop(),
                        status: 'done',
                    }
                })
            }
            // 法人身份证
            if (obj.juridicalIdcard) {
                this.idcardFileList = obj.juridicalIdcard.split(',').map((item: any) => {
                    return {
                        url: item,
                        id: item,
                        name: (item.match(/[^\\/]+\.[^\\/]+$/) || []).pop(),
                        status: 'done',
                    }
                })
            }
            // 合同
            if (obj.contractFile) {
                this.fileList = obj.contractFile.split(',').map((item: any) => {
                    return {
                        url: item,
                        id: item,
                        name: (item.match(/[^\\/]+\.[^\\/]+$/) || []).pop(),
                        status: 'done',
                    }
                })
            }
            // 合同附件
            if (obj.contractEnclosure) {
                this.fileList2 = obj.contractEnclosure.split(',').map((item: any) => {
                    return {
                        url: item,
                        id: item,
                        name: (item.match(/[^\\/]+\.[^\\/]+$/) || []).pop(),
                        status: 'done',
                    }
                })
            }
            // 账户附件
            if (obj.accountAttachment) {
                this.accountFileList = obj.accountAttachment.split(',').map((item: any) => {
                    return {
                        url: item,
                        id: item,
                        name: (item.match(/[^\\/]+\.[^\\/]+$/) || []).pop(),
                        status: 'done',
                    }
                })
            }
        }
    }

    /**
     * 详情
     */
    getDetails() {
        this.sqeAddService.details(this.id).subscribe((res: any) => {
            this.detailsData = res.data;
            this.initData(res.data);
            this.isLoading = false;

            if (this.fileList && this.fileList.length > 0) {
                // 草稿
                this.normal = false;
                // 正常
                this.frozen = false;
                // 合作结束
                this.endOfCooperation = false;
                // 合同过期
                this.contractExpired = false;
            }
        }, err => {
            this.isLoading = false;
        })
    }

    submitForm(): void {
        // console.log('submitdata', this.validateForm.value);
        // return
        const { districtId, address } = this.modalForm
        if (!this.validateForm.value.abbreviation) {
            return this.createMessage('warning', '请输入简称');
        } else if (!this.validateForm.value.type) {
            return this.createMessage('warning', '请选择类型');
        } else if (!this.validateForm.value.state) {
            return this.createMessage('warning', '请选择状态');
        }
        for (const i in this.validateForm.controls) {
            this.validateForm.controls[i].markAsDirty();
            this.validateForm.controls[i].updateValueAndValidity();
        }

        // 合同文件
        // const contractFileList = [];
        // for (let index = 0; index < this.fileList.length; index++) {
        //     contractFileList.push(this.fileList[index].url);
        // }
        // this.validateForm.value.contractFile = contractFileList.toString();

        if (this.fileList.length > 0) {
            if (!this.createTime) {
                return this.createMessage('warning', '请选择合同生效日期');
            }
            if (!this.time) {
                return this.createMessage('warning', '请选择合同失效日期');
            }
        }
        if (this.createTime || this.time) {
            if (!(this.fileList.length > 0)) {
                return this.createMessage('warning', '请输入上传合同');
            }
        }
        
        // 附件
        // const contractEnclosureList = [];
        // if (this.fileList2 && this.fileList2.length > 0) {
        //     for (let index = 0; index < this.fileList2.length; index++) {
        //         contractEnclosureList.push(this.fileList2[index].url);
        //     }
        // }
        // this.validateForm.value.contractEnclosure = contractEnclosureList.toString();
        
        //businessFile,juridicalIdcard,contractFile,contractEnclosure,accountAttachment
        //licenseFileList, idcardFileList, fileList, fileList2, accountFileList
        this.validateForm.value.businessFile = this.licenseFileList.map((item: any) => item.url).toString(); // 营业执照
        this.validateForm.value.juridicalIdcard = this.idcardFileList.map((item: any) => item.url).toString(); // 法人身份
        this.validateForm.value.contractFile = this.fileList.map((item: any) => item.url).toString(); // 合同文件
        this.validateForm.value.contractEnclosure = this.fileList2.map((item: any) => item.url).toString(); // 合同附件
        this.validateForm.value.accountAttachment = this.accountFileList.map((item: any) => item.url).toString(); // 账户附件

        this.validateForm.value.districtId = (districtId && districtId.length === 3) ? districtId[2] : ''

        // this.validateForm.value.address = address
        // console.log('suabmit info', this.validateForm.value);
        // return
        if (this.validateForm.value.id == null) {
            this.sqeAddService.add(this.validateForm.value).subscribe((res: any) => {
                this.isLoading = false;
                if (res.code != 0) {
                    this.createMessage('error', res.message);
                    return;
                }
                this.createMessage('success', '添加成功');
                this.router.navigate(['stock/sqe']);
            }, err => {
                this.isLoading = false;
            })
        } else {
            this.sqeAddService.update(this.validateForm.value).subscribe((res: any) => {
                this.isLoading = false;
                if (res.code != 0) {
                    this.createMessage('error', res.message);
                    return;
                }
                this.createMessage('success', '修改成功');
                this.router.navigate(['stock/sqe'])
            }, err => {
                this.createMessage('error', '请求出错');
                this.isLoading = false;
            })
        }
    }

    /**
     * 合同文件
     * @param file 
     * @returns 
     */
    beforeUpload = (file: any): boolean => {
        this.fileList = this.fileList.concat(file);
        this.validateForm.get('contractFile')!.setValue(this.fileList[0].name);
        return false;
    }
    /**
     * 上传图片
     * @param e 
     */
    onUpload(e: MouseEvent): void {
        e.preventDefault();
    }

    uploadTip(files: any) {
        // 此处也需要清空，不然第二次无法上传相同的问题件
        files.target.value = "";
        this.createMessage('warning', '仅允许上传一个文件');
    }
    /**
     * 文件上传完成回调
     * @param files 
     * @param type 1：合同文件，2：合同附件，3：营业执照，4：法人身份证，5：账户附件
     */
    handleFileInput(files: any, type: any) {
        let fileArr = files.target.files;
        switch (type) {
            case 1:
                if (this.fileList.length == 1) {
                    this.uploadTip(files);
                }
                break;
            case 3:
                if (this.licenseFileList.length == 1) {
                    this.uploadTip(files);
                }
                break;
            case 4:
                if (this.idcardFileList.length == 1) {
                    this.uploadTip(files);
                }
                break;
        }
        // if (type == 1 && this.fileList.length == 1) {
        //     // 此处也需要清空，不然第二次无法上传相同的问题件
        //     files.target.value = "";
        //     this.createMessage('warning', '仅允许上传一个文件');
        //     return;
        // }
        for (let index = 0; index < fileArr.length; index++) {
            const element = fileArr[index];
            this.postFile(element, this.splitFileName(element.name), (res: any) => {
                if (res.code != 0) {
                    return;
                }
                // 合同文件
                if (type == 1) {
                    this.fileList.push({
                        url: res.data,
                        id: res.data,
                        name: files.target.files[0].name,
                    })
                    // 草稿
                    this.normal = false;
                    // 正常
                    this.frozen = false;
                    // 合作结束
                    this.endOfCooperation = false;
                    // 合同过期
                    this.contractExpired = false;
                    files.target.value = "";
                    this.createMessage('success', '合同文件上传成功');
                } else if (type == 2) {   // 附件
                    this.fileList2.push({
                        url: res.data,
                        id: res.data,
                        name: files.target.files[index].name,
                    });
                    this.createMessage('success', '附件上传成功');
                } else if (type == 3) {
                    // 营业执照
                    // licenseFileList: any[] = [];
                    // 法人身份证
                    // idcardFileList: any[] = [];
                    // 账户附件
                    // accountFileList: any[] = [];
                    this.licenseFileList.push({
                        url: res.data,
                        id: res.data,
                        name: files.target.files[index].name,
                    });
                    this.createMessage('success', '营业执照上传成功');
                } else if (type == 4) {
                    this.idcardFileList.push({
                        url: res.data,
                        id: res.data,
                        name: files.target.files[index].name,
                    });
                    this.createMessage('success', '法人身份证上传成功');
                } else if (type == 5) {
                    this.accountFileList.push({
                        url: res.data,
                        id: res.data,
                        name: files.target.files[index].name,
                    });
                    this.createMessage('success', '账户附件上传成功');
                }
            });
        }
    }

    stateInfo() {
        if (this.fileList.length > 0) {
            return "";
        }
        return "请先选择合同文件才可以改变状态";
    }

    /**
     * 上传文件
     * @param file
     * @param fileName
     * @param su 上传完成回调函数
     */
    postFile(file: any, fileName: string, su: any) {
        this.sqeAddService.postFile(file, fileName).subscribe(data => {
            if (data.code != 0) {
                this.message.error(data.message || '上传失败');
            }
            if (su) su(data);
        }, error => {

        });
    }
    fileDown(url: any) {
        window.location.href = url;
    }
    deleteFile(id: any) {
        for (let i = 0; i < this.fileList2.length; i++) {
            if (this.fileList2[i].id == id) {
                this.fileList2.splice(i, 1);
            }
        }
    }

    contractFileDown(url: any) {
        window.location.href = url;
    }
    deleteContractFile(id: any) {
        // 草稿
        this.normal = true;
        // 正常
        this.frozen = true;
        // 合作结束
        this.endOfCooperation = true;
        // 合同过期
        this.contractExpired = true;

        this.state = "0";
        this.fileList = this.fileList.filter((d: any) => d.id !== id);
        if (this.fileList.length == 0) {
            this.validateForm.value.state = 0;
            this.createTime = null;
            this.time = null;
            this.createMessage('warning', '无合同文件的情况下，状态已变回草稿');
        }

    }
    // 获取 省 市 区
    async httpAreaList() {
        const list = [];
        const { districtId } = this.detailsData || {}
        try {
            const { province, city, county }: any = await this.sqeAddService.area()
            for (const key in province) { // 省

                const { id, name: label } = province[key];
                const provinceSet: any = { value: id, label, children: [] }
                for (const ck in city[id]) { // 市

                    const { id: cityId, name: label } = city[id][ck];
                    const citySet: any = { value: cityId, label, children: [] }
                    for (const ak in county[cityId]) { // 区

                        const { id: areaId, name: label } = county[cityId][ak];
                        citySet.children.push({ value: areaId, label, isLeaf: true, })

                        if (districtId == areaId) {
                            this.modalForm.districtId = [id, cityId, areaId]
                        }
                    }
                    provinceSet.children.push(citySet);
                }
                list.push(provinceSet);
            }
            this.areaList = list
        } catch (error) {
        }
    }

    // 日期选择change
    onChange(result: Date, paramStr: any): void {
        this.validateForm.get(paramStr)?.setValue(this.datePipe.transform(new Date(result), 'yyyy-MM-dd'));
    }

    // 附件下载
    downLoadFile(url: any) {
        window.open(url, '_blank');
    }
    // 附件删除
    deleteLoadFile(index: number, array: any) {
        array.splice(index, 1);
    }

    // 上传文件夹字符串截取
    splitFileName(text: string) {
        var pattern: any = /\.{1}[a-z]{1,}$/;
        if (pattern.exec(text) !== null) {
            return (text.slice(0, pattern.exec(text).index));
        } else {
            return text;
        }
    }

    /**
    * 全局展示操作反馈信息
    * @param type 其他提示类型 success:成功 error:失败 warning:警告
    */
    createMessage(type: any, str: any): void {
        this.message.create(type, str);
    }
}

